/*
    文件内容: Channel类,处理Epoll中的数据
    文件名: Channel.h
    作者: 中国好青年(码农论坛)
    时间: 2024/9/6
*/

#pragma once

#include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/tcp.h>
#include <string.h>
#include <errno.h>
#include <unistd.h>
#include <sys/epoll.h>
#include <vector>
#include <functional>
#include "EventLoop.h"
#include "InetAddress.h"
#include "Socket.h"
#include "Connection.h"

class EventLoop;

/*
    类名: Channel
    作用: 封装Channel相关操作类
*/
class Channel
{
private:
    //Channel拥有的fd,Channel:fd 一对一的关系
    int fd_ = -1;
    //Channel拥有的Epoll根实例,Channel:Epoll根 多对一的关系,一个Channel只能有1个Epoll根实例
    EventLoop *loop_ = nullptr;
    //Channel是否添加到Epoll树上
    bool inepoll_ = false;
    //Channel的fd需要监听的事件
    uint32_t events_ = 0;
    //Channel的fd已发生的事件
    uint32_t revents_ = 0;
    //判断是否监听socketfd
    std::function<void()> readcallback_;
    std::function<void()> closecallback_;
    std::function<void()> errorcallback_;
    std::function<void()> writecallback_;
public:
    /* 构造函数 和 析构函数 */
    Channel(EventLoop* loop, int fd);
    ~Channel();

    /* Channel相关操作函数 */
    int fd();
    void enableEt();
    void enableReadEvent();
    void disableReadEvent();
    void enableWriteEvent();
    void disableWriteEvent();
    void disableall();
    void remove();
    void enableInepoll();
    void setRevents(uint32_t ev);
    void setReadCallback(std::function<void()> readCallback);
    void setCloseCallback(std::function<void()> closecallback);
    void setErrorCallback(std::function<void()> errorcallback);
    void setWriteCallback(std::function<void()> writecallback);
        
    bool inepoll();
    uint32_t events();
    uint32_t revents();

    void handleEvents();
};